/**
 * Generieke systray class.
 * Bij alle mogelijke acties: contextMenuActie en iconClickActie 
 * word een SIGNAL getriggered genaamd newAction(QString) met als parameter
 * de naam van de actie.
 * 
 * Definieer via SysTray::addMenuAction de context menu acties.
 * iconClickActies zijn natuurlijk al gedefinieerd.
 * - Icon click acties.
 *   "0" - Unknown reason.
 *   "1" - Context menu clicked.
 *   "2" - Left mouse double clicked
 *   "3" - Left mouse click
 *   "4" - Middleclick
 *
 */

#include "systray.h"
#include <QMovie>

/**Constructor
 * Initieer de SystemTray,QMenu en signals.
 */
Systray::Systray()
{
        trayIcon = new QSystemTrayIcon();
	trayIconMenu=new QMenu();
	alarmAnimTimer=new QTimer(this);
	systrayNormalIcon=QIcon(":systrayNormalIcon");
	systrayAlertIcon=QIcon(":systrayAlertIcon");
	systrayErrorIcon=QIcon(":systrayErrorIcon");

        trayIcon->setIcon(systrayNormalIcon);
        trayIcon->setContextMenu(trayIconMenu);
	trayIcon->show();

	connect(alarmAnimTimer,SIGNAL(timeout()),this,SLOT(flipIconAlarm()));
	connect(trayIconMenu,SIGNAL(triggered(QAction*)),this,SLOT(handleMenuTrigger(QAction*)));
	connect(trayIcon,SIGNAL(activated(QSystemTrayIcon::ActivationReason)),this,SLOT(handleIconTrigger(QSystemTrayIcon::ActivationReason)));

}

/**
 * Voeg een menu actie toe.
 */
void Systray::addMenuAction(QString actionName)
{
	if(actionName!="") 
		trayIconMenu->addAction(actionName);
	else
		trayIconMenu->addSeparator();
}

/**
 * Handelt een menu actie af.
 * Door de actienaam via een SIGNAL weg te sturen....
 */
void Systray::handleMenuTrigger(QAction *action)
{
	emit newAction(action->text());
}

/**
 * Handelt iconclick acties af.
 */
void Systray::handleIconTrigger(QSystemTrayIcon::ActivationReason reason)
{
	emit newAction(QString().number(reason));
}

/**
 * Start een alarm animatie, via een timer
 * die switched tussen 2 icons.
 */
void Systray::startAlarmAnim()
{
	if(alarmAnimTimer->isActive())
		return;
	flipIconAlarmHelper=1;
       	this->setIcon(&systrayAlertIcon);
        alarmAnimTimer->start(500);
}

/**
 * Stopt de alarm animatie.
 */
void Systray::stopAlarmAnim()
{
	if(!alarmAnimTimer->isActive())
		return;
	alarmAnimTimer->stop();
       	this->setIcon(&systrayNormalIcon);
}


/**
 * Veranderd de icon van normal naar error icon of andersom.
 */
void Systray::setErrorState(bool error)
{
	//De error state mag niet geset worden tijdens een alarm.
	if(alarmAnimTimer->isActive())
		return;
	if(error)
		this->setIcon(&systrayErrorIcon);
	else
		this->setIcon(&systrayNormalIcon);
}


/**
 * Set de gegeven icon.
 */
void Systray::setIcon(QIcon *newIcon)
{
	//Controleer of de nieuwe icon reeds geset is.
	if(trayIcon->icon().cacheKey()==newIcon->cacheKey())
		return;
	trayIcon->setIcon(*newIcon);
}


/**
 * Deze SLOT word door de timer van startAlarmAnim aangeroepen.
 */
void Systray::flipIconAlarm()
{
	if(flipIconAlarmHelper) {
		flipIconAlarmHelper=0;
        	this->setIcon(&systrayNormalIcon);
	}
	else {
		flipIconAlarmHelper=1;
        	this->setIcon(&systrayAlertIcon);
	}
}


/**
 * Hiermee kan de huidige settooltip mee vervangen worden.
 */
void Systray::setToolTip(QString toolTip)
{
	trayIcon->setToolTip(toolTip);
}

/**
 * Hides the systray.
 */
void Systray::hide()
{
	trayIcon->hide();
}
